package thread;

// 此处不考虑泛型，只使用 int 来表示元素类型
class MyBlockQueue {
    private int[] items = new int[1000]; //要先有数组
    private int head = 0; //头部
    private int tail = 0; //尾部
    private int size = 0; //元素个数

    //入队列
    public void put(int value) throws InterruptedException{
        synchronized (this) {
            //如果数组空间满了就不能插入了
            while (items.length == size) {
                //队列满了就要阻塞等待
                this.wait();
            }
            items[tail] = value;
            tail++;

            //针对于tail位于数组末尾的处理
            if (tail >= items.length) {
                tail = 0; //重新放到数组的开头
            }
            size++; //队列元素个数加一个
            //唤醒 take 中的 wait
            this.notify();
        }
    }

    //出队列
    public Integer take() throws InterruptedException{
        int result = 0;
        synchronized (this) {
            //如果队列是空的不能出队列
            while (size == 0) {
                //队列为空就阻塞
                this.wait();
            }
            result = items[head];
            head++; //head向后移一个位置

            //针对head位于数组末尾位置的处理
            if (head >= items.length) {
                head = 0; //重新指向数组的开头
            }
            size--; //元素个数减一个
            //唤醒 put 中的 wait
            this.notify();
        }
        return result;
    }
}
public class ThreadDemo3 {

    public static void main(String[] args) throws InterruptedException{
        MyBlockQueue myBlockQueue = new MyBlockQueue();
        //入队列
        myBlockQueue.put(1);
        myBlockQueue.put(2);
        myBlockQueue.put(3);

        //出队列
        int result = 0;
        result = myBlockQueue.take();
        System.out.println("result = " + result);
        result = myBlockQueue.take();
        System.out.println("result = " + result);
        result = myBlockQueue.take();
        System.out.println("result = " + result);
    }
}
